# 15.3 随机漫步
    # 每次行走都完全是随机的，没有明确的方向、结果是由一系列随机决策决定的

from random import choice   # 将所有的选择都存储在一个列表中
                            # 并在每次决策时都是用choice()来决定使用哪种选择

class RandomWalk():
    """一个生成随机漫步的类"""

    def __init__(self, num_points = 5000):  #默认点数设置为5000
        """初始化随机漫步的属性"""
        self.num_points = num_points

        # 所有随机漫步都始于点（0,0）
        self.x_values = [0]
        self.y_values = [0]

    def get_step(self):
        """
        获取下一步如何移动
        决定前进方向以及沿这个方向前进的距离
        即：向右走还是向左走？沿指定的方向走多远？
             向上走还是向下走？沿指定的方向走多远？
        """
        direction = choice([1, -1])  # 1表示向右走，-1表示向左走
        distance = choice([0, 1, 2, 3, 4])  # 随机的选择一个0~4之间的整数来决定走多远

        return direction * distance  # 将移动方向乘以移动距离，确定下一步如何移动

    def fill_walk(self):
        """计算随机漫步包含的所有点"""

        # 不断漫步，直到列表到指定的长度
        while len(self.x_values) < self.num_points:
            x_step = self.get_step()
            y_step = self.get_step()

            # 拒绝原地踏步
            if x_step == 0 and y_step == 0: # 沿x和y轴移动距离均为0，表示原地踏步
                continue

            # 计算漫步下一个点的x和y值
            next_x = self.x_values[-1] + x_step
            next_y = self.y_values[-1] + y_step

            self.x_values.append(next_x)
            self.y_values.append(next_y)